package com.score.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * ErrorInterceptor 类实现了 Spring 的 HandlerInterceptor 接口，
 * 用于在请求处理的不同阶段进行拦截操作，可用于处理错误页面跳转等功能。
 * 该类被标记为 @Controller，不过通常拦截器不需要此注解，一般用 @Component 更合适。
 */
@Controller
public class ErrorInterceptor implements HandlerInterceptor {

	/**
	 * preHandle 方法在请求处理之前被调用。
	 * 该方法可以决定是否继续执行后续的请求处理流程。
	 * 如果返回 true，则继续执行后续的拦截器和控制器；如果返回 false，则中断请求处理流程。
	 *
	 * @param request 当前的 HTTP 请求对象
	 * @param response 当前的 HTTP 响应对象
	 * @param handler 执行链中的下一个处理器
	 * @return 布尔值，指示是否继续执行后续的请求处理流程
	 * @throws Exception 处理过程中可能抛出的异常
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// 目前直接返回 true，允许请求继续执行后续的处理流程
		return true;
	}

	/**
	 * postHandle 方法在控制器处理请求之后、视图渲染之前被调用。
	 * 可以在这里对 ModelAndView 对象进行修改，或者根据响应状态进行一些处理。
	 *
	 * @param request 当前的 HTTP 请求对象
	 * @param response 当前的 HTTP 响应对象
	 * @param handler 执行链中的下一个处理器
	 * @param modelAndView 控制器返回的 ModelAndView 对象，可以对其进行修改
	 * @throws Exception 处理过程中可能抛出的异常
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
						   ModelAndView modelAndView) throws Exception {
		/*
		 * 此代码块被注释掉，功能是当响应状态码为 404 时，
		 * 将视图名称设置为 /404.html，从而跳转到 404 错误页面。
		 * 若需要启用该功能，可取消注释。
		 */
        /*	if (response.getStatus() == 404) {
			modelAndView.setViewName("/404.html");
		}*/
	}

	/**
	 * afterCompletion 方法在整个请求处理完成后（包括视图渲染完成）被调用。
	 * 通常用于进行资源清理等操作。
	 *
	 * @param request 当前的 HTTP 请求对象
	 * @param response 当前的 HTTP 响应对象
	 * @param handler 执行链中的下一个处理器
	 * @param ex 处理过程中抛出的异常，如果没有异常则为 null
	 * @throws Exception 处理过程中可能抛出的异常
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// 目前该方法为空，可根据需求添加资源清理等操作
	}
}